/**
 * Observer类的作用是：将一个正常的object转换为每个层级的属性都是响应式（可以被侦测）的object
 */

import { def } from './utils.js'
import defineReactive from './defineReactive'
import { arrayMethods } from './array'
import observe from './observe.js'
import Dep from './Dep.js'

export default class Observer {
  constructor(value) {
    // 每一个Observer的实例身上，都与一个Dep实例
    this.dep = new Dep()
    // 给实例添加一个__ob__属性,this不是表示类本身，而是表示实例
    def(value, '__ob__', this, false)
    // 检查它是数组还是对象
    if (Array.isArray(value)) {
      // 是数组，将这个数组的原型，指向arrayMethods
      Object.setPrototypeOf(value, arrayMethods)
      // 让这个数组变的observe
      this.observeArray(value)
    } else {
      this.walk(value)
    }
  }

  // walk方法遍历,给每个属性添加响应式
  walk(value) {
    for (const k in value) {
      defineReactive(value, k)
    }
  }

  // 数组的特殊遍历
  observeArray(arr) {
    for (let i = 0, l = arr.length; i < l; i++) {
      // 逐项进行observe
      observe(arr[i])
    }
  }
}
